package br.com.virtualsoluction.dao;

import br.com.virtualsoluction.bo.Produto;
import br.com.virtualsoluction.utilitarios.ConnectionFactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class DAOProduto implements CRUD<Produto>{
    
    private String sql;
    private Connection c;
    private PreparedStatement s;
    private ResultSet rs;
    
    public DAOProduto(){
        this.sql = "";
        this.c = new ConnectionFactory().getConnection();
        this.s = null;
        this.rs = null;        
    }

    public boolean insert(Produto elemento) {
        
        int i;
        boolean b;
        this.sql =  "insert into produto (id, descricao, precovenda, estoque )";
        this.sql += " values (?, ? , ? , ? )";

        i = getChave();

        try {
            this.s = this.c.prepareStatement(this.sql);
            this.s.setInt(1, i);
            this.s.setString(2, elemento.getDescricao());
            this.s.setDouble(3, elemento.getPrecoVenda());//elemento.getPrecoVenda());
            this.s.setInt(4, elemento.getEstoque());
            b = this.s.execute();
            return b;
        } catch (SQLException ex) {
            return false;
        }       
    }

    public boolean update(Produto elemento) {

        this.sql =  "update produto ";
        this.sql += "set descricao = ? , ";
        this.sql += "precovenda = ? , ";
        this.sql += "estoque = ? , ";        
        this.sql += "where (id = ? )";

        try{
            this.s = this.c.prepareStatement(this.sql);
            this.s.setString(1, elemento.getDescricao());
            this.s.setDouble(2, elemento.getPrecoVenda());
            this.s.setInt(3, elemento.getEstoque());            
            this.s.setInt(4, elemento.getCodigo());
            this.s.executeUpdate();                       
            return true;

        }catch(SQLException ex){
            return false;
        }
    }

    public boolean delete(Produto elemento) {

        this.sql =  "delete from produto";
        this.sql += "where (id = ? )";

        try{
            this.s = this.c.prepareStatement(this.sql);
            this.s.setInt(1, elemento.getCodigo());
            this.s.execute();            
            return true;
        }catch(SQLException ex){
            return false;
        }
    }

    public Produto search(int id) {
        
        this.sql = "select id, descricao, estoque, precovenda from produto where id = ? ";
        
        try {
            this.s = c.prepareStatement(this.sql);
            this.s.setInt(1, id);
            this.rs = this.s.executeQuery();
            rs.next();
            Produto pt = new Produto();
            pt.setCodigo(rs.getInt("id"));
            pt.setDescricao(rs.getString("descricao"));
            pt.setEstoque(rs.getInt("estoque"));
            pt.setPrecoVenda(rs.getDouble("precovenda"));

            return pt;

        } catch (SQLException ex) {
            Logger.getLogger(DAOProduto.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    public List<Produto> getList() {
        List<Produto> prod = new ArrayList<Produto>();
        this.sql =  "select id, descricao, estoque, precovenda from produto order by id";        
                        
        try {
            this.s = c.prepareStatement(this.sql);
            this.rs = this.s.executeQuery();
            
            while(rs.next()){
                Produto pt = new Produto();
                pt.setCodigo(rs.getInt("id"));
                pt.setDescricao(rs.getString("descricao"));
                pt.setEstoque(rs.getInt("estoque"));
                pt.setPrecoVenda(rs.getDouble("precovenda"));
                prod.add(pt);
            }            
            return prod;
            
        } catch (SQLException ex) {
            Logger.getLogger(DAOProduto.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }
    
    public int getChave(){

        String vSQL ="";
        int ret = 0;

        vSQL = "select gen_id(gen_produto_id,1) from rdb$database";
        try {
            this.s = this.c.prepareStatement(vSQL);
        } catch (SQLException ex) {
            Logger.getLogger(DAOProduto.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            this.rs = this.s.executeQuery();
        } catch (SQLException ex) {
            Logger.getLogger(DAOProduto.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            rs.next();
            ret = rs.getInt("gen_id");
        } catch (SQLException ex) {
            Logger.getLogger(DAOProduto.class.getName()).log(Level.SEVERE, null, ex);
        }

        return ret;
    }
}